package com.skyyan.netty.jjf.util;

import cn.hutool.core.codec.BCD;
import cn.hutool.core.util.StrUtil;

import java.time.LocalDateTime;

public class OrderUtils {

    /**
     * 根据设备序列号获取 订单编号 为8字节BCD码
     *
     * @param deviceSerialNoBytes 为设备序列号 占三个字节 低位在前 高位在后
     * 订单序列号为 设备序列号 10进制 除以10000 求余数 ，不足四位 前边补0 +时间戳（YYMMDDHHMMSS）6位
     * @return
     * @throws Exception
     */
//    public static byte[] genBcdOrderId(byte[] deviceSerialNoBytes) throws Exception{
//        if (deviceSerialNoBytes == null || deviceSerialNoBytes.length < 3) {
//            throw new Exception("设备序列号长度必须为3字节");
//        }
//
//        // Step 1: 将3字节小端序设备序列号转换为int（24位无符号整数）
//        int serialValue = (deviceSerialNoBytes[2] & 0xFF) << 16 |
//                (deviceSerialNoBytes[1] & 0xFF) << 8  |
//                (deviceSerialNoBytes[0] & 0xFF);
//
//        // Step 2: 取 serialValue % 10000，得到0~9999之间的数
//        int remainder = serialValue % 10000;
//
//        // Step 3: 格式化为4位字符串，不足补0
//        String prefix = String.format("%04d", remainder); // 如：0012, 1234
//
//        // Step 4: 获取时间部分 YYMMDDHHMMSS（6位BCD对应6字节）
//        String timeStr = JJFDateTimeUtils.getYYMMDDHHMMSS(); // 假设返回如 "240829112705"
//        if (timeStr == null || timeStr.length() != 12) {
//            throw new Exception("时间获取失败或格式错误");
//        }
//        // Step 5: 合并前缀 + 时间 → 共10位数字 → 转为5字节BCD（但我们需要8字节=16位，高位补0）
//        // 注意：BCD是每字节存2位数字，8字节可存16位数字
//        // 当前我们只有：4位(prefix) + 12位(timeStr) = 16位，正好！
//
//        String fullDigits = prefix + timeStr; // 共16位数字字符串
//
//        // Step 6: 将16位数字字符串转为8字节BCD
//        byte[] orderId = BcdUtil.stringToBcd(fullDigits, 8); // 转换为8字节BCD
//        return orderId;
//    }


    public static byte[] genBcdOrderId(byte[] deviceSerialNoBytes) throws Exception{
        if (deviceSerialNoBytes == null || deviceSerialNoBytes.length < 3) {
            throw new Exception("设备序列号长度必须为3字节");
        }
        // 取最后两个字节
        byte dev1 = deviceSerialNoBytes[deviceSerialNoBytes.length - 2];
        byte dev2 = deviceSerialNoBytes[deviceSerialNoBytes.length - 1];

        // 获取当前时间
        LocalDateTime now = LocalDateTime.now();

        // 提取年、月、日、时、分、秒
        int year = now.getYear() % 100; // 取后两位：2025 → 25
        int month = now.getMonthValue();
        int day = now.getDayOfMonth();
        int hour = now.getHour();
        int minute = now.getMinute();
        int second = now.getSecond();

        // 转为 BCD 编码（每字节存两个十进制位）
        byte bcdYear  = (byte) (((year  / 10) << 4) | (year  % 10));
        byte bcdMonth = (byte) (((month / 10) << 4) | (month % 10));
        byte bcdDay   = (byte) (((day   / 10) << 4) | (day   % 10));
        byte bcdHour  = (byte) (((hour  / 10) << 4) | (hour  % 10));
        byte bcdMinute= (byte) (((minute/ 10) << 4) | (minute% 10));
        byte bcdSecond= (byte) (((second/ 10) << 4) | (second% 10));

        // 组合成结果数组：2 (设备) + 6 (时间) = 8 字节？还是 7？常见是 7 字节（不含毫秒）
        // 这里假设：2字节设备号 + 6字节时间 = 8 字节
        return new byte[] {
                dev1, dev2,           // 设备号后两字节（原样保留，已是二进制）
                bcdYear,
                bcdMonth,
                bcdDay,
                bcdHour,
                bcdMinute,
                bcdSecond
        };
    }
    /**
     * 订单号为 deviceSerialNoBytes 后2个字节 +年月日时分秒
     * @param deviceSerialNoBytes 手持终端设备序列号 占三个字节
     * @return
     * @throws Exception
     */
    public static String genOrderId(byte[] deviceSerialNoBytes) throws Exception{

        byte[] orderId = genBcdOrderId(deviceSerialNoBytes);
        return BcdUtil.bcdToStringNoRemoveZeros(orderId);
    }


    public static byte[] genBcdOrderId(String  orderId,int len) throws Exception{
        return  BcdUtil.stringToBcd(orderId,len);
    }


    // 测试
    public static void main(String[] args)throws Exception {
        byte[] deviceSerialNoBytes = {0x01, 0x02, 0x03};
        byte[] result = OrderUtils.genBcdOrderId(deviceSerialNoBytes);

        // 打印十六进制
        System.out.print("BCD Array: ");
        for (byte b : result) {
            System.out.printf("%02X", b);
        }
        System.out.println("==========");
        System.out.print("BCD Array: "+ BcdUtil.bcdToStringNoRemoveZeros(result));
        String orderId=BcdUtil.bcdToStringNoRemoveZeros(result);
        byte[] orderIdBcd = BCD.strToBcd(StrUtil.padPre(orderId, 16, '0'));


         orderIdBcd =OrderUtils.genBcdOrderId(orderId,8);
        boolean isEqual = java.util.Arrays.equals(result, orderIdBcd);
        if (isEqual) {
            System.out.println("两个数组内容相等");
        } else {
            System.out.println("不相等");
        }

    }
}
